Data Loading and Processing

First, we’ll load our dependencies and process the crash data:

District and Street Processing

Next, we’ll process the senate district data and Lake Shore Drive information:

Reading layer `senate_districts' from data source 
  `/Users/mmclean/dev/r/ilga_district_crashes/data/raw/shapefiles/senate/senate_districts.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 59 features and 3 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: -91.51308 ymin: 36.9703 xmax: -87.4952 ymax: 42.50848
Geodetic CRS:  NAD83

Crash Analysis

Process crashes within the Lake Shore Drive buffer:

Crash Impact Visualizations

Fatalities Over Time

Total Injuries Over Time

Incapacitating Injuries Over Time

Summary Statistics

Metric Lake Shore Drive District 6 Total Percentage of District Total
Total Crashes 6248 32490 19.2%
Total Injuries 1415 5452 26.0%
Incapacitating Injuries 166 584 28.4%
Fatalities 16 26 61.5%

Interactive Map Visualization

District 6 Fatality Map

Create an interactive map showing fatality locations in District 6:

Lake Shore Drive Injury Map

Create interactive maps showing injuries, incapacitating injuries, and fatalities along Lake Shore Drive:

Lake Shore Drive Incapacitating Injury Map

LS0tCnRpdGxlOiAiTGFrZSBTaG9yZSBEcml2ZSBEaXN0cmljdCA2IENyYXNoIEFuYWx5c2lzIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIG91dHB1dF9kaXI6IGRvY3MKICAgIG91dHB1dF9maWxlOiBkaXN0cmljdDZfY3Jhc2hlcy5odG1sCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpCmBgYAoKIyMgRGF0YSBMb2FkaW5nIGFuZCBQcm9jZXNzaW5nCgpGaXJzdCwgd2UnbGwgbG9hZCBvdXIgZGVwZW5kZW5jaWVzIGFuZCBwcm9jZXNzIHRoZSBjcmFzaCBkYXRhOgoKYGBge3IgbG9hZC1kYXRhLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIFNvdXJjZSB1dGlsaXR5IGZ1bmN0aW9ucyAod2hpY2ggbG9hZHMgbGlicmFyaWVzKQpzb3VyY2UoIlIvdXRpbHMuUiIpCgojIFJlYWQgYW5kIHByb2Nlc3MgY3Jhc2ggZGF0YQpjcmFzaGVzIDwtIGxvYWRfY3Jhc2hfZGF0YSgiZGF0YS9yYXcvY3Jhc2hlcy90cmFmZmljX2NyYXNoZXMuY3N2IikKY3Jhc2hlc19zZiA8LSBjb252ZXJ0X3RvX3NmKGNyYXNoZXMpCgojIFJlYWQgYW5kIHByb2Nlc3MgZmF0YWxpdHkgZGF0YQpjcmFzaF9mYXRhbGl0aWVzIDwtIGxvYWRfZmF0YWxpdHlfZGF0YSgiZGF0YS9yYXcvY3Jhc2hlcy9jcmFzaF9mYXRhbGl0aWVzLmNzdiIpCmNyYXNoX2ZhdGFsaXRpZXNfc2YgPC0gY29udmVydF90b19zZihjcmFzaF9mYXRhbGl0aWVzLCAiTG9uZ2l0dWRlIiwgIkxhdGl0dWRlIikKCiMgQ29tYmluZSBjcmFzaGVzIGFuZCBmYXRhbGl0aWVzCmNvbWJpbmVkX2NyYXNoZXNfc2YgPC0gYmluZF9yb3dzKGNyYXNoZXNfc2YsIGNyYXNoX2ZhdGFsaXRpZXNfc2YpCmBgYAoKIyMgRGlzdHJpY3QgYW5kIFN0cmVldCBQcm9jZXNzaW5nCgpOZXh0LCB3ZSdsbCBwcm9jZXNzIHRoZSBzZW5hdGUgZGlzdHJpY3QgZGF0YSBhbmQgTGFrZSBTaG9yZSBEcml2ZSBpbmZvcm1hdGlvbjoKCmBgYHtyIHByb2Nlc3MtZGlzdHJpY3QsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgTG9hZCBzZW5hdGUgZGlzdHJpY3Qgc2hhcGVmaWxlIGFuZCBmaWx0ZXIgZm9yIGxha2Vmcm9udCBkaXN0cmljdHMKc2VuYXRlX2Rpc3RyaWN0cyA8LSBsb2FkX2Rpc3RyaWN0X3NoYXBlZmlsZSgKICAiZGF0YS9yYXcvc2hhcGVmaWxlcy9zZW5hdGUvc2VuYXRlX2Rpc3RyaWN0cy5zaHAiLAogIG5ld19uYW1lID0gInNlbmF0ZV9kaXN0cmljdCIKKQpsYWtlZnJvbnRfZGlzdHJpY3RzIDwtIHNlbmF0ZV9kaXN0cmljdHMgJT4lCiAgZmlsdGVyKHNlbmF0ZV9kaXN0cmljdCAlaW4lIGMoIjYiLCAiNyIsICIxMyIpKQoKZGlzdHJpY3RfNiA8LSBzZW5hdGVfZGlzdHJpY3RzICU+JQogIGZpbHRlcihzZW5hdGVfZGlzdHJpY3QgPT0gIjYiKQoKIyBTcGF0aWFsIGpvaW4gY3Jhc2hlcyB3aXRoIGxha2Vmcm9udCBkaXN0cmljdHMKbGFrZWZyb250X2NyYXNoZXMgPC0gc3Rfam9pbihjb21iaW5lZF9jcmFzaGVzX3NmLCBsYWtlZnJvbnRfZGlzdHJpY3RzLCBsZWZ0ID0gRkFMU0UpCgojIFRyYW5zZm9ybSB0byBtZXRlci1iYXNlZCBDUlMgZm9yIGFjY3VyYXRlIGRpc3RhbmNlIGNhbGN1bGF0aW9ucwpsYWtlZnJvbnRfY3Jhc2hlcyA8LSBzdF90cmFuc2Zvcm0obGFrZWZyb250X2NyYXNoZXMsIDM4NTcpCgojIEtlZXAgZGlzdHJpY3QgNiBjcmFzaGVzIGZvciBkaXN0cmljdC1zcGVjaWZpYyBhbmFseXNpcwpjcmFzaGVzX3dpdGhfZGlzdHJpY3QgPC0gbGFrZWZyb250X2NyYXNoZXMgJT4lCiAgZmlsdGVyKHNlbmF0ZV9kaXN0cmljdCA9PSAiNiIpCgojIFF1ZXJ5IE9TTSBmb3IgTGFrZSBTaG9yZSBEcml2ZQpsYWtlX3Nob3JlX3N0cmVldHMgPC0gb3BxKGJib3ggPSBDSElDQUdPX0JCT1gpICU+JQogIGFkZF9vc21fZmVhdHVyZShrZXkgPSAnaGlnaHdheScpICU+JQogIGFkZF9vc21fZmVhdHVyZShrZXkgPSAnbmFtZScsIHZhbHVlID0gJ0xha2UgU2hvcmUnLCB2YWx1ZV9leGFjdCA9IEZBTFNFKSAlPiUKICBvc21kYXRhX3NmKCkgJT4lCiAgcGx1Y2soIm9zbV9saW5lcyIpICU+JQogIHtyZW5hbWUoLiwgc3RyZWV0X25hbWUgPSBuYW1lKX0gJT4lCiAgc3RfdHJhbnNmb3JtKGNycyA9IDM4NTcpCmBgYAoKIyMgQ3Jhc2ggQW5hbHlzaXMKClByb2Nlc3MgY3Jhc2hlcyB3aXRoaW4gdGhlIExha2UgU2hvcmUgRHJpdmUgYnVmZmVyOgoKYGBge3IgYW5hbHl6ZS1jcmFzaGVzLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIENyZWF0ZSBidWZmZXIgYXJvdW5kIExha2UgU2hvcmUgRHJpdmUgYW5kIGlkZW50aWZ5IGludGVyc2VjdGluZyBjcmFzaGVzCmJ1ZmZlciA8LSBzdF9idWZmZXIobGFrZV9zaG9yZV9zdHJlZXRzLCBkaXN0ID0gQlVGRkVSX0RJU1RBTkNFX00pCmludGVyc2VjdHMgPC0gc3RfaW50ZXJzZWN0cyhjcmFzaGVzX3dpdGhfZGlzdHJpY3QsIGJ1ZmZlciwgc3BhcnNlID0gRkFMU0UpCgojIEZpbHRlciBjcmFzaGVzIHdpdGhpbiBidWZmZXIgYW5kIGNhbGN1bGF0ZSBjb3VudHMgZm9yIGFsbCBsYWtlZnJvbnQgZGlzdHJpY3RzCmxha2Vmcm9udF9pbnRlcnNlY3RzIDwtIHN0X2ludGVyc2VjdHMobGFrZWZyb250X2NyYXNoZXMsIGJ1ZmZlciwgc3BhcnNlID0gRkFMU0UpCmxha2Vmcm9udF9jcmFzaGVzJGlzX2xha2VzaG9yZV9jcmFzaCA8LSBhcHBseShsYWtlZnJvbnRfaW50ZXJzZWN0cywgMSwgYW55KQpsYWtlc2hvcmVfY3Jhc2hlcyA8LSBsYWtlZnJvbnRfY3Jhc2hlcyAlPiUKICBmaWx0ZXIoaXNfbGFrZXNob3JlX2NyYXNoKSAlPiUKICBtdXRhdGUoCiAgICBjcmFzaF9jb3VudCA9IDEsCiAgICBmYXRhbGl0eV9jb3VudCA9IGlmZWxzZSghaXMubmEoRkFUQUxJVFlfVklDVElNKSAmIEZBVEFMSVRZX1ZJQ1RJTSAhPSAiIiwgMSwgMCksCiAgICB0b3RhbF9pbmp1cmllcyA9IElOSlVSSUVTX1RPVEFMLAogICAgaW5jYXBfaW5qdXJpZXMgPSBJTkpVUklFU19JTkNBUEFDSVRBVElORwogICkKCiMgQ3JlYXRlIGZhdGFsaXR5IHN1YnNldApsYWtlc2hvcmVfZmF0YWxpdGllcyA8LSBsYWtlc2hvcmVfY3Jhc2hlcyAlPiUKICBmaWx0ZXIoZmF0YWxpdHlfY291bnQgPiAwKQoKIyBDcmVhdGUgZGlzdHJpY3Qtc3BlY2lmaWMgc3Vic2V0cyBmb3IgdGhlIHRpbWUgc2VyaWVzIHZpc3VhbGl6YXRpb25zCmRpc3RyaWN0Nl9jcmFzaGVzIDwtIGxha2VzaG9yZV9jcmFzaGVzICU+JQogIGZpbHRlcihzZW5hdGVfZGlzdHJpY3QgPT0gIjYiKQpgYGAKCiMjIENyYXNoIEltcGFjdCBWaXN1YWxpemF0aW9ucwoKIyMjIEZhdGFsaXRpZXMgT3ZlciBUaW1lCgpgYGB7ciBmYXRhbGl0aWVzLWNoYXJ0LCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD01LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIFByZXBhcmUgZmF0YWxpdGllcyBkYXRhCmZhdGFsaXRpZXNfYnlfeWVhciA8LSBkaXN0cmljdDZfY3Jhc2hlcyAlPiUKICBmaWx0ZXIoZmF0YWxpdHlfY291bnQgPiAwKSAlPiUKICBzdF9kcm9wX2dlb21ldHJ5KCkgJT4lCiAgbXV0YXRlKHllYXIgPSBsdWJyaWRhdGU6OnllYXIoQ1JBU0hfREFURSkpICU+JQogIGdyb3VwX2J5KHllYXIpICU+JQogIHN1bW1hcml6ZSh0b3RhbF9mYXRhbGl0aWVzID0gc3VtKGZhdGFsaXR5X2NvdW50LCBuYS5ybSA9IFRSVUUpKQoKIyBHZXQgbWluIGFuZCBtYXggeWVhcnMgZm9yIGNvbnNpc3RlbnQgeC1heGlzCm1pbl95ZWFyIDwtIG1pbihmYXRhbGl0aWVzX2J5X3llYXIkeWVhcikKbWF4X3llYXIgPC0gbWF4KGZhdGFsaXRpZXNfYnlfeWVhciR5ZWFyKQoKIyBDcmVhdGUgdGhlIGZhdGFsaXRpZXMgdmlzdWFsaXphdGlvbgpnZ3Bsb3QoZmF0YWxpdGllc19ieV95ZWFyLCBhZXMoeCA9IHllYXIsIHkgPSB0b3RhbF9mYXRhbGl0aWVzKSkgKwogIGdlb21fY29sKGZpbGwgPSAiIzkzNzBEQiIsIHdpZHRoID0gMC43KSArCiAgZ2VvbV90ZXh0KAogICAgYWVzKGxhYmVsID0gdG90YWxfZmF0YWxpdGllcyksCiAgICB2anVzdCA9IC0wLjUsCiAgICBzaXplID0gMy41LAogICAgZmFtaWx5ID0gIkFyaWFsIgogICkgKwogIGxhYnMoCiAgICB4ID0gIlllYXIiLAogICAgeSA9IE5VTEwsCiAgICB0aXRsZSA9ICJUcmFmZmljIEZhdGFsaXRpZXMgQWxvbmcgTGFrZSBTaG9yZSBEcml2ZSBpbiBEaXN0cmljdCA2IiwKICAgIHN1YnRpdGxlID0gIkFubnVhbCBjb3VudCBvZiB0cmFmZmljLXJlbGF0ZWQgZmF0YWxpdGllcyIsCiAgICBjYXB0aW9uID0gIkRhdGE6IENoaWNhZ28gQ2l0eSBEYXRhIFBvcnRhbCBcIlRyYWZmaWMgQ3Jhc2hlcyAtIFZpc2lvbiBaZXJvIENoaWNhZ28gVHJhZmZpYyBGYXRhbGl0aWVzXCIgUmV0cmlldmVkIEZlYi4gNiwgMjAyNQpJbmNsdWRlcyBjcmFzaGVzIHJlcG9ydGVkIHdpdGhpbiAxMDBmdCBvZiBEdVNhYmxlIExha2UgU2hvcmUgRHJpdmUiCiAgKSArCiAgc2NhbGVfeF9jb250aW51b3VzKAogICAgYnJlYWtzID0gc2VxKG1pbl95ZWFyLCBtYXhfeWVhciwgYnkgPSAxKQogICkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLCAwLjE1KSksCiAgICBicmVha3MgPSBmdW5jdGlvbih4KSBzZXEoMCwgY2VpbGluZyhtYXgoeCkpLCBieSA9IDEpCiAgKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZSgKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDEyLCBtYXJnaW4gPSBtYXJnaW4oYiA9IDEwKSksCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgY29sb3IgPSAiIzY2NjY2NiIpLAogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI0ZGRkNGNyIpLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNGRkZDRjciKSwKICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICIjZjBmMGYwIiwgbGluZXdpZHRoID0gMC4zKSwKICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIkFyaWFsIiksCiAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiIzY2NjY2NiIpLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICIjNjY2NjY2IiksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiM2NjY2NjYiKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjNjY2NjY2IiksCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoCiAgICAgIGNvbG9yID0gIiM2NjY2NjYiLAogICAgICBzaXplID0gOCwKICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSAxMCksCiAgICAgIGhqdXN0ID0gMAogICAgKSwKICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKHQgPSAxNSwgciA9IDIwLCBiID0gMTUsIGwgPSAxNSwgdW5pdCA9ICJwdCIpCiAgKQpgYGAKCiMjIyBUb3RhbCBJbmp1cmllcyBPdmVyIFRpbWUKCmBgYHtyIGluanVyaWVzLWNoYXJ0LCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD01LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIFByZXBhcmUgaW5qdXJpZXMgZGF0YQppbmp1cmllc19ieV95ZWFyIDwtIGRpc3RyaWN0Nl9jcmFzaGVzICU+JQogIHN0X2Ryb3BfZ2VvbWV0cnkoKSAlPiUKICBtdXRhdGUoCiAgICB5ZWFyID0gbHVicmlkYXRlOjp5ZWFyKENSQVNIX0RBVEUpLAogICAgdG90YWxfaW5qdXJpZXMgPSBJTkpVUklFU19UT1RBTAogICkgJT4lCiAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgc3VtbWFyaXplKHRvdGFsX2luanVyaWVzID0gc3VtKHRvdGFsX2luanVyaWVzLCBuYS5ybSA9IFRSVUUpKQoKIyBDcmVhdGUgdGhlIGluanVyaWVzIHZpc3VhbGl6YXRpb24KZ2dwbG90KGluanVyaWVzX2J5X3llYXIsIGFlcyh4ID0geWVhciwgeSA9IHRvdGFsX2luanVyaWVzKSkgKwogIGdlb21fY29sKGZpbGwgPSAiIzkzNzBEQiIsIHdpZHRoID0gMC43KSArCiAgZ2VvbV90ZXh0KAogICAgYWVzKGxhYmVsID0gdG90YWxfaW5qdXJpZXMpLAogICAgdmp1c3QgPSAtMC41LAogICAgc2l6ZSA9IDMuNSwKICAgIGZhbWlseSA9ICJBcmlhbCIKICApICsKICBsYWJzKAogICAgeCA9ICJZZWFyIiwKICAgIHkgPSBOVUxMLAogICAgdGl0bGUgPSAiSW5qdXJpZXMgRnJvbSBDcmFzaGVzIEFsb25nIER1U2FibGUgTGFrZSBTaG9yZSBEcml2ZSBpbiBEaXN0cmljdCA2IiwKICAgIHN1YnRpdGxlID0gIlRvdGFsIHBlcnNvbnMgc3VzdGFpbmluZyBmYXRhbCwgaW5jYXBhY2l0YXRpbmcsIG5vbi1pbmNhcGFjaXRhdGluZywgYW5kIHBvc3NpYmxlIGluanVyaWVzIiwKICAgIGNhcHRpb24gPSAiRGF0YTogQ2hpY2FnbyBDaXR5IERhdGEgUG9ydGFsIFwiVHJhZmZpYyBDcmFzaGVzXCIgUmV0cmlldmVkIEZlYi4gNiwgMjAyNQpJbmNsdWRlcyBjcmFzaGVzIHJlcG9ydGVkIHdpdGhpbiAxMDBmdCBvZiBEdVNhYmxlIExha2UgU2hvcmUgRHJpdmUiCiAgKSArCiAgc2NhbGVfeF9jb250aW51b3VzKAogICAgYnJlYWtzID0gc2VxKG1pbl95ZWFyLCBtYXhfeWVhciwgYnkgPSAxKQogICkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLCAwLjE1KSksCiAgICBicmVha3MgPSBmdW5jdGlvbih4KSBzZXEoMCwgY2VpbGluZyhtYXgoeCkpLCBieSA9IDUwKQogICkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxMiwgbWFyZ2luID0gbWFyZ2luKGIgPSAxMCkpLAogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGNvbG9yID0gIiM2NjY2NjYiKSwKICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNGRkZDRjciKSwKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjRkZGQ0Y3IiksCiAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiI2YwZjBmMCIsIGxpbmV3aWR0aCA9IDAuMyksCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJBcmlhbCIpLAogICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gIiM2NjY2NjYiKSwKICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiIzY2NjY2NiIpLAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjNjY2NjY2IiksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzY2NjY2NiIpLAogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KAogICAgICBjb2xvciA9ICIjNjY2NjY2IiwKICAgICAgc2l6ZSA9IDgsCiAgICAgIG1hcmdpbiA9IG1hcmdpbih0ID0gMTApLAogICAgICBoanVzdCA9IDAKICAgICksCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbih0ID0gMTUsIHIgPSAyMCwgYiA9IDE1LCBsID0gMTUsIHVuaXQgPSAicHQiKQogICkKYGBgCgojIyMgSW5jYXBhY2l0YXRpbmcgSW5qdXJpZXMgT3ZlciBUaW1lCgpgYGB7ciBpbmNhcC1pbmp1cmllcy1jaGFydCwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBQcmVwYXJlIGluY2FwYWNpdGF0aW5nIGluanVyaWVzIGRhdGEKaW5jYXBfaW5qdXJpZXNfYnlfeWVhciA8LSBkaXN0cmljdDZfY3Jhc2hlcyAlPiUKICBzdF9kcm9wX2dlb21ldHJ5KCkgJT4lCiAgbXV0YXRlKAogICAgeWVhciA9IGx1YnJpZGF0ZTo6eWVhcihDUkFTSF9EQVRFKSwKICAgIGluY2FwX2luanVyaWVzID0gSU5KVVJJRVNfSU5DQVBBQ0lUQVRJTkcKICApICU+JQogIGdyb3VwX2J5KHllYXIpICU+JQogIHN1bW1hcml6ZSh0b3RhbF9pbmNhcF9pbmp1cmllcyA9IHN1bShpbmNhcF9pbmp1cmllcywgbmEucm0gPSBUUlVFKSkKCiMgQ3JlYXRlIHRoZSBpbmNhcGFjaXRhdGluZyBpbmp1cmllcyB2aXN1YWxpemF0aW9uCmdncGxvdChpbmNhcF9pbmp1cmllc19ieV95ZWFyLCBhZXMoeCA9IHllYXIsIHkgPSB0b3RhbF9pbmNhcF9pbmp1cmllcykpICsKICBnZW9tX2NvbChmaWxsID0gIiM5MzcwREIiLCB3aWR0aCA9IDAuNykgKwogIGdlb21fdGV4dCgKICAgIGFlcyhsYWJlbCA9IHRvdGFsX2luY2FwX2luanVyaWVzKSwKICAgIHZqdXN0ID0gLTAuNSwKICAgIHNpemUgPSAzLjUsCiAgICBmYW1pbHkgPSAiQXJpYWwiCiAgKSArCiAgbGFicygKICAgIHggPSAiWWVhciIsCiAgICB5ID0gTlVMTCwKICAgIHRpdGxlID0gIkluY2FwYWNpdGF0aW5nIEluanVyaWVzIEFsb25nIER1U2FibGUgTGFrZSBTaG9yZSBEcml2ZSBpbiBEaXN0cmljdCA2IiwKICAgIHN1YnRpdGxlID0gIlRvdGFsIHBlcnNvbnMgc3VzdGFpbmluZyBpbmNhcGFjaXRhdGluZy9zZXJpb3VzIGluanVyaWVzIGluIGEgY3Jhc2giLAogICAgY2FwdGlvbiA9ICJEYXRhOiBDaGljYWdvIENpdHkgRGF0YSBQb3J0YWwgXCJUcmFmZmljIENyYXNoZXNcIiBSZXRyaWV2ZWQgRmViLiA2LCAyMDI1CkluY2x1ZGVzIGNyYXNoZXMgcmVwb3J0ZWQgd2l0aGluIDEwMGZ0IG9mIER1U2FibGUgTGFrZSBTaG9yZSBEcml2ZSIKICApICsKICBzY2FsZV94X2NvbnRpbnVvdXMoCiAgICBicmVha3MgPSBzZXEobWluX3llYXIsIG1heF95ZWFyLCBieSA9IDEpCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsIDAuMTUpKSwKICAgIGJyZWFrcyA9IGZ1bmN0aW9uKHgpIHNlcSgwLCBjZWlsaW5nKG1heCh4KSksIGJ5ID0gNSkKICApICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gMTIsIG1hcmdpbiA9IG1hcmdpbihiID0gMTApKSwKICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBjb2xvciA9ICIjNjY2NjY2IiksCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjRkZGQ0Y3IiksCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI0ZGRkNGNyIpLAogICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gIiNmMGYwZjAiLCBsaW5ld2lkdGggPSAwLjMpLAogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiQXJpYWwiKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICIjNjY2NjY2IiksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gIiM2NjY2NjYiKSwKICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiIzY2NjY2NiIpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiM2NjY2NjYiKSwKICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dCgKICAgICAgY29sb3IgPSAiIzY2NjY2NiIsCiAgICAgIHNpemUgPSA4LAogICAgICBtYXJnaW4gPSBtYXJnaW4odCA9IDEwKSwKICAgICAgaGp1c3QgPSAwCiAgICApLAogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4odCA9IDE1LCByID0gMjAsIGIgPSAxNSwgbCA9IDE1LCB1bml0ID0gInB0IikKICApCmBgYAoKIyMgU3VtbWFyeSBTdGF0aXN0aWNzCgpgYGB7ciBjcmFzaC1zdGF0c30KIyBDYWxjdWxhdGUgTGFrZSBTaG9yZSBEcml2ZSBzdGF0aXN0aWNzCmxha2VzaG9yZV90b3RhbF9jcmFzaGVzIDwtIG5yb3coZGlzdHJpY3Q2X2NyYXNoZXMpCmxha2VzaG9yZV90b3RhbF9pbmp1cmllcyA8LSBzdW0oZGlzdHJpY3Q2X2NyYXNoZXMkSU5KVVJJRVNfVE9UQUwsIG5hLnJtID0gVFJVRSkKbGFrZXNob3JlX3RvdGFsX2luY2FwX2luanVyaWVzIDwtIHN1bShkaXN0cmljdDZfY3Jhc2hlcyRJTkpVUklFU19JTkNBUEFDSVRBVElORywgbmEucm0gPSBUUlVFKQpsYWtlc2hvcmVfdG90YWxfZmF0YWxpdGllcyA8LSBzdW0oZGlzdHJpY3Q2X2NyYXNoZXMkZmF0YWxpdHlfY291bnQsIG5hLnJtID0gVFJVRSkKCiMgQ2FsY3VsYXRlIERpc3RyaWN0IDYgdG90YWwgc3RhdGlzdGljcwpkaXN0cmljdF90b3RhbF9jcmFzaGVzIDwtIG5yb3coY3Jhc2hlc193aXRoX2Rpc3RyaWN0KQpkaXN0cmljdF90b3RhbF9pbmp1cmllcyA8LSBzdW0oY3Jhc2hlc193aXRoX2Rpc3RyaWN0JElOSlVSSUVTX1RPVEFMLCBuYS5ybSA9IFRSVUUpCmRpc3RyaWN0X3RvdGFsX2luY2FwX2luanVyaWVzIDwtIHN1bShjcmFzaGVzX3dpdGhfZGlzdHJpY3QkSU5KVVJJRVNfSU5DQVBBQ0lUQVRJTkcsIG5hLnJtID0gVFJVRSkKZGlzdHJpY3RfdG90YWxfZmF0YWxpdGllcyA8LSBzdW0oIWlzLm5hKGNyYXNoZXNfd2l0aF9kaXN0cmljdCRGQVRBTElUWV9WSUNUSU0pICYgY3Jhc2hlc193aXRoX2Rpc3RyaWN0JEZBVEFMSVRZX1ZJQ1RJTSAhPSAiIiwgbmEucm0gPSBUUlVFKQoKIyBDcmVhdGUgc3VtbWFyeSBzdGF0aXN0aWNzIGRhdGFmcmFtZQpjcmFzaF9zdGF0cyA8LSB0aWJibGUoCiAgTWV0cmljID0gYygiVG90YWwgQ3Jhc2hlcyIsICJUb3RhbCBJbmp1cmllcyIsICJJbmNhcGFjaXRhdGluZyBJbmp1cmllcyIsICJGYXRhbGl0aWVzIiksCiAgYExha2UgU2hvcmUgRHJpdmVgID0gYyhsYWtlc2hvcmVfdG90YWxfY3Jhc2hlcywgbGFrZXNob3JlX3RvdGFsX2luanVyaWVzLCBsYWtlc2hvcmVfdG90YWxfaW5jYXBfaW5qdXJpZXMsIGxha2VzaG9yZV90b3RhbF9mYXRhbGl0aWVzKSwKICBgRGlzdHJpY3QgNiBUb3RhbGAgPSBjKGRpc3RyaWN0X3RvdGFsX2NyYXNoZXMsIGRpc3RyaWN0X3RvdGFsX2luanVyaWVzLCBkaXN0cmljdF90b3RhbF9pbmNhcF9pbmp1cmllcywgZGlzdHJpY3RfdG90YWxfZmF0YWxpdGllcykKKSAlPiUKICBtdXRhdGUoCiAgICBgUGVyY2VudGFnZSBvZiBEaXN0cmljdCBUb3RhbGAgPSBzcHJpbnRmKCIlLjFmJSUiLCAoYExha2UgU2hvcmUgRHJpdmVgIC8gYERpc3RyaWN0IDYgVG90YWxgKSAqIDEwMCkKICApCgojIENyZWF0ZSBmb3JtYXR0ZWQgdGFibGUKa25pdHI6OmthYmxlKGNyYXNoX3N0YXRzLCBmb3JtYXQgPSAiaHRtbCIpICU+JQogIGthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcoCiAgICBib290c3RyYXBfb3B0aW9ucyA9ICJzdHJpcGVkIiwKICAgIGZ1bGxfd2lkdGggPSBGQUxTRSwKICAgIHBvc2l0aW9uID0gImxlZnQiCiAgKSAlPiUKICBrYWJsZUV4dHJhOjpyb3dfc3BlYygwLCBib2xkID0gVFJVRSwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gIiM0QjAwODIiKSAlPiUKICBrYWJsZUV4dHJhOjpjb2x1bW5fc3BlYygxLCBib2xkID0gVFJVRSkKYGBgCgojIyBJbnRlcmFjdGl2ZSBNYXAgVmlzdWFsaXphdGlvbgoKIyMjIERpc3RyaWN0IDYgRmF0YWxpdHkgTWFwCgpDcmVhdGUgYW4gaW50ZXJhY3RpdmUgbWFwIHNob3dpbmcgZmF0YWxpdHkgbG9jYXRpb25zIGluIERpc3RyaWN0IDY6CgpgYGB7ciBjcmVhdGUtbWFwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIFRyYW5zZm9ybSBnZW9tZXRyaWVzIHRvIFdHUzg0IGZvciBtYXBwaW5nCmxha2VzaG9yZV9mYXRhbGl0aWVzIDwtIHN0X3RyYW5zZm9ybShsYWtlc2hvcmVfZmF0YWxpdGllcywgNDMyNikKbGFrZV9zaG9yZV9zdHJlZXRzIDwtIHN0X3RyYW5zZm9ybShsYWtlX3Nob3JlX3N0cmVldHMsIDQzMjYpCmJ1ZmZlciA8LSBzdF90cmFuc2Zvcm0oYnVmZmVyLCA0MzI2KQpkaXN0cmljdF82IDwtIHN0X3RyYW5zZm9ybShkaXN0cmljdF82LCA0MzI2KQoKIyBDcmVhdGUgTGFrZSBTaG9yZSBEcml2ZSBkaXN0cmljdCA2IGZhdGFsaXR5IG1hcApkaXN0cmljdDZfZmF0YWxpdHlfbWFwIDwtIGxlYWZsZXQoKSAlPiUKICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRDYXJ0b0RCLlBvc2l0cm9uKSAlPiUKICAjIEFkZCBkaXN0cmljdCA2CiAgYWRkUG9seWdvbnMoCiAgICBkYXRhID0gZGlzdHJpY3RfNiwKICAgIGZpbGxDb2xvciA9ICIjOTM3MERCIiwgICMgTWVkaXVtIHB1cnBsZQogICAgZmlsbE9wYWNpdHkgPSAwLjMsCiAgICBjb2xvciA9ICIjNEIwMDgyIiwgICMgSW5kaWdvCiAgICB3ZWlnaHQgPSAyLAogICAgbGFiZWwgPSB+cGFzdGUoIlNlbmF0ZSBEaXN0cmljdCIsIHNlbmF0ZV9kaXN0cmljdCkKICApICU+JQogICMgQWRkIExha2UgU2hvcmUgRHJpdmUKICBhZGRQb2x5bGluZXMoCiAgICBkYXRhID0gbGFrZV9zaG9yZV9zdHJlZXRzLAogICAgY29sb3IgPSAiI0NDQ0NDQyIsCiAgICB3ZWlnaHQgPSAzCiAgKSAlPiUKICAjIEFkZCB0aGUgYnVmZmVyIGFyZWEKICBhZGRQb2x5Z29ucygKICAgIGRhdGEgPSBidWZmZXIsCiAgICBmaWxsQ29sb3IgPSAiI0NDQ0NDQyIsICAjIExpZ2h0IGdyYXkKICAgIGZpbGxPcGFjaXR5ID0gMC4yLAogICAgY29sb3IgPSAiI0NDQ0NDQyIsICAjIExpZ2h0IGdyYXkKICAgIHdlaWdodCA9IDIKICApICU+JQogICMgQWRkIGNsdXN0ZXJlZCBmYXRhbGl0eSBjaXJjbGVzCiAgYWRkQ2lyY2xlTWFya2VycygKICAgIGRhdGEgPSBsYWtlc2hvcmVfZmF0YWxpdGllcywKICAgIGxuZyA9IH5zdF9jb29yZGluYXRlcyhnZW9tZXRyeSlbLCAxXSwKICAgIGxhdCA9IH5zdF9jb29yZGluYXRlcyhnZW9tZXRyeSlbLCAyXSwKICAgIHJhZGl1cyA9IDYsICAjIEJhc2Ugc2l6ZSBmb3IgaW5kaXZpZHVhbCBwb2ludHMKICAgIGNvbG9yID0gInJlZCIsCiAgICBmaWxsQ29sb3IgPSAicmVkIiwKICAgIGZpbGxPcGFjaXR5ID0gMC42LAogICAgc3Ryb2tlID0gVFJVRSwKICAgIHdlaWdodCA9IDEsCiAgICBwb3B1cCA9IH5wYXN0ZSgKICAgICAgIkRhdGU6IiwgQ1JBU0hfREFURSwgIjxicj4iLAogICAgICAiRmF0YWxpdGllczoiLCBmYXRhbGl0eV9jb3VudCwgIjxicj4iLAogICAgICAiVHlwZToiLCBGSVJTVF9DUkFTSF9UWVBFCiAgICApLAogICAgY2x1c3Rlck9wdGlvbnMgPSBtYXJrZXJDbHVzdGVyT3B0aW9ucygKICAgICAgbWF4Q2x1c3RlclJhZGl1cyA9IDUwICogMC4wMDAzLCAgIyBBcHByb3hpbWF0ZSBjb252ZXJzaW9uIG9mIDUwZnQgdG8gZGVncmVlcwogICAgICBzcGlkZXJmeU9uTWF4Wm9vbSA9IFRSVUUsCiAgICAgIGljb25DcmVhdGVGdW5jdGlvbiA9IEpTKCIKICAgICAgICBmdW5jdGlvbihjbHVzdGVyKSB7CiAgICAgICAgICB2YXIgY291bnQgPSBjbHVzdGVyLmdldENoaWxkQ291bnQoKTsKICAgICAgICAgIHZhciBzaXplID0gTWF0aC5taW4oNTAsIDIwICsgTWF0aC5zcXJ0KGNvdW50KSAqIDgpOwogICAgICAgICAgcmV0dXJuIG5ldyBMLkRpdkljb24oewogICAgICAgICAgICBodG1sOiAnPGRpdiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAwLCAwLCAwLjYpOyB3aWR0aDogJyArIHNpemUgKyAncHg7IGhlaWdodDogJyArIHNpemUgKyAncHg7IG1hcmdpbi1sZWZ0OiAtJyArIChzaXplLzIpICsgJ3B4OyBtYXJnaW4tdG9wOiAtJyArIChzaXplLzIpICsgJ3B4OyBib3JkZXItcmFkaXVzOiA1MCU7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBjb2xvcjogd2hpdGU7IGZvbnQtd2VpZ2h0OiBib2xkOyBib3JkZXI6IDJweCBzb2xpZCByZ2JhKDI1NSwgMCwgMCwgMC44KTtcIj4nICsgY291bnQgKyAnPC9kaXY+JywKICAgICAgICAgICAgY2xhc3NOYW1lOiAnbWFya2VyLWNsdXN0ZXItY3VzdG9tJywKICAgICAgICAgICAgaWNvblNpemU6IEwucG9pbnQoc2l6ZSwgc2l6ZSkKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgIikKICAgICkKICApICU+JQogIHNldFZpZXcobG5nID0gLTg3LjYyOTgsIGxhdCA9IDQxLjg3ODEsIHpvb20gPSAxMikKCiMgRGlzcGxheSB0aGUgbWFwCmRpc3RyaWN0Nl9mYXRhbGl0eV9tYXAKYGBgCgojIyMgTGFrZSBTaG9yZSBEcml2ZSBJbmp1cnkgTWFwCgpDcmVhdGUgaW50ZXJhY3RpdmUgbWFwcyBzaG93aW5nIGluanVyaWVzLCBpbmNhcGFjaXRhdGluZyBpbmp1cmllcywgYW5kIGZhdGFsaXRpZXMgYWxvbmcgTGFrZSBTaG9yZSBEcml2ZToKCmBgYHtyIGNyZWF0ZS1sYWtlc2hvcmUtbWFwcywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBUcmFuc2Zvcm0gZ2VvbWV0cmllcyB0byBXR1M4NCBmb3IgbWFwcGluZwpsYWtlc2hvcmVfY3Jhc2hlc180MzI2IDwtIHN0X3RyYW5zZm9ybShsYWtlc2hvcmVfY3Jhc2hlcywgNDMyNikKbGFrZWZyb250X2Rpc3RyaWN0c180MzI2IDwtIHN0X3RyYW5zZm9ybShsYWtlZnJvbnRfZGlzdHJpY3RzLCA0MzI2KQoKIyBDcmVhdGUgYmluYXJ5IGluZGljYXRvcnMgZm9yIGNyYXNoZXMgd2l0aCBpbmp1cmllcwpsYWtlc2hvcmVfY3Jhc2hlc180MzI2IDwtIGxha2VzaG9yZV9jcmFzaGVzXzQzMjYgJT4lCiAgbXV0YXRlKAogICAgaGFzX2luanVyaWVzID0gaWZlbHNlKElOSlVSSUVTX1RPVEFMID4gMCwgMSwgMCksCiAgICBoYXNfaW5jYXBfaW5qdXJpZXMgPSBpZmVsc2UoSU5KVVJJRVNfSU5DQVBBQ0lUQVRJTkcgPiAwLCAxLCAwKQogICkKCiMgQ3JlYXRlIGluanVyaWVzIGhlYXRtYXAgd2l0aCBhZGp1c3RlZCBwYXJhbWV0ZXJzCmluanVyaWVzX21hcCA8LSBsZWFmbGV0KCkgJT4lCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkQ2FydG9EQi5Qb3NpdHJvbikgJT4lCiAgIyBBZGQgbGFrZWZyb250IGRpc3RyaWN0cyBvdXRsaW5lcwogIGFkZFBvbHlnb25zKAogICAgZGF0YSA9IGxha2Vmcm9udF9kaXN0cmljdHNfNDMyNiwKICAgIGZpbGxPcGFjaXR5ID0gMCwKICAgIGNvbG9yID0gIiM0QjAwODIiLCAgIyBJbmRpZ28KICAgIHdlaWdodCA9IDIsCiAgICBsYWJlbCA9IH5wYXN0ZSgiU2VuYXRlIERpc3RyaWN0Iiwgc2VuYXRlX2Rpc3RyaWN0KQogICkgJT4lCiAgIyBBZGQgTGFrZSBTaG9yZSBEcml2ZQogIGFkZFBvbHlsaW5lcygKICAgIGRhdGEgPSBsYWtlX3Nob3JlX3N0cmVldHMsCiAgICBjb2xvciA9ICIjNjY2NjY2IiwKICAgIHdlaWdodCA9IDMKICApICU+JQogICMgQWRkIGluanVyaWVzIGhlYXRtYXAKICBhZGRIZWF0bWFwKAogICAgZGF0YSA9IGxha2VzaG9yZV9jcmFzaGVzXzQzMjYgJT4lIGZpbHRlcihoYXNfaW5qdXJpZXMgPT0gMSksCiAgICBsbmcgPSB+c3RfY29vcmRpbmF0ZXMoZ2VvbWV0cnkpWywgMV0sCiAgICBsYXQgPSB+c3RfY29vcmRpbmF0ZXMoZ2VvbWV0cnkpWywgMl0sCiAgICBpbnRlbnNpdHkgPSB+MSwgICMgRWFjaCBjcmFzaCB3aXRoIGluanVyaWVzIGNvdW50cyBhcyAxCiAgICBibHVyID0gMTUsCiAgICBtYXggPSAwLjEsCiAgICByYWRpdXMgPSAxMgogICkgJT4lCiAgc2V0VmlldyhsbmcgPSAtODcuNjI5OCwgbGF0ID0gNDEuODc4MSwgem9vbSA9IDEyKQoKIyBEaXNwbGF5IHRoZSBtYXAKaW5qdXJpZXNfbWFwCmBgYAoKIyMjIExha2UgU2hvcmUgRHJpdmUgSW5jYXBhY2l0YXRpbmcgSW5qdXJ5IE1hcAoKYGBge3IgaW5jYXAtaW5qdXJpZXMtbWFwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKIyBDcmVhdGUgaW5jYXBhY2l0YXRpbmcgaW5qdXJpZXMgaGVhdG1hcAppbmNhcF9pbmp1cmllc19tYXAgPC0gbGVhZmxldCgpICU+JQogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJENhcnRvREIuUG9zaXRyb24pICU+JQogICMgQWRkIGxha2Vmcm9udCBkaXN0cmljdHMgb3V0bGluZXMKICBhZGRQb2x5Z29ucygKICAgIGRhdGEgPSBsYWtlZnJvbnRfZGlzdHJpY3RzXzQzMjYsCiAgICBmaWxsT3BhY2l0eSA9IDAsCiAgICBjb2xvciA9ICIjNEIwMDgyIiwgICMgSW5kaWdvCiAgICB3ZWlnaHQgPSAyLAogICAgbGFiZWwgPSB+cGFzdGUoIlNlbmF0ZSBEaXN0cmljdCIsIHNlbmF0ZV9kaXN0cmljdCkKICApICU+JQogICMgQWRkIExha2UgU2hvcmUgRHJpdmUKICBhZGRQb2x5bGluZXMoCiAgICBkYXRhID0gbGFrZV9zaG9yZV9zdHJlZXRzLAogICAgY29sb3IgPSAiIzY2NjY2NiIsCiAgICB3ZWlnaHQgPSAzCiAgKSAlPiUKICAjIEFkZCBpbmNhcGFjaXRhdGluZyBpbmp1cmllcyBoZWF0bWFwCiAgYWRkSGVhdG1hcCgKICAgIGRhdGEgPSBsYWtlc2hvcmVfY3Jhc2hlc180MzI2ICU+JSBmaWx0ZXIoaGFzX2luY2FwX2luanVyaWVzID09IDEpLAogICAgbG5nID0gfnN0X2Nvb3JkaW5hdGVzKGdlb21ldHJ5KVssIDFdLAogICAgbGF0ID0gfnN0X2Nvb3JkaW5hdGVzKGdlb21ldHJ5KVssIDJdLAogICAgaW50ZW5zaXR5ID0gfjEsICAjIEVhY2ggY3Jhc2ggd2l0aCBpbmNhcGFjaXRhdGluZyBpbmp1cmllcyBjb3VudHMgYXMgMQogICAgYmx1ciA9IDE1LAogICAgbWF4ID0gMC4xLAogICAgcmFkaXVzID0gMTIKICApICU+JQogIHNldFZpZXcobG5nID0gLTg3LjYyOTgsIGxhdCA9IDQxLjg3ODEsIHpvb20gPSAxMikKCiMgRGlzcGxheSB0aGUgbWFwCmluY2FwX2luanVyaWVzX21hcAoKIyMjIExha2UgU2hvcmUgRHJpdmUgRmF0YWxpdHkgTWFwCgojIENyZWF0ZSBmYXRhbGl0aWVzIG1hcCB3aXRoIGNsdXN0ZXJzCmZhdGFsaXRpZXNfbWFwIDwtIGxlYWZsZXQoKSAlPiUKICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRDYXJ0b0RCLlBvc2l0cm9uKSAlPiUKICAjIEFkZCBsYWtlZnJvbnQgZGlzdHJpY3RzIG91dGxpbmVzCiAgYWRkUG9seWdvbnMoCiAgICBkYXRhID0gbGFrZWZyb250X2Rpc3RyaWN0c180MzI2LAogICAgZmlsbE9wYWNpdHkgPSAwLAogICAgY29sb3IgPSAiIzRCMDA4MiIsICAjIEluZGlnbwogICAgd2VpZ2h0ID0gMiwKICAgIGxhYmVsID0gfnBhc3RlKCJTZW5hdGUgRGlzdHJpY3QiLCBzZW5hdGVfZGlzdHJpY3QpCiAgKSAlPiUKICAjIEFkZCBMYWtlIFNob3JlIERyaXZlCiAgYWRkUG9seWxpbmVzKAogICAgZGF0YSA9IGxha2Vfc2hvcmVfc3RyZWV0cywKICAgIGNvbG9yID0gIiM2NjY2NjYiLAogICAgd2VpZ2h0ID0gMwogICkgJT4lCiAgIyBBZGQgY2x1c3RlcmVkIGZhdGFsaXR5IGNpcmNsZXMKICBhZGRDaXJjbGVNYXJrZXJzKAogICAgZGF0YSA9IGxha2VzaG9yZV9mYXRhbGl0aWVzLAogICAgbG5nID0gfnN0X2Nvb3JkaW5hdGVzKGdlb21ldHJ5KVssIDFdLAogICAgbGF0ID0gfnN0X2Nvb3JkaW5hdGVzKGdlb21ldHJ5KVssIDJdLAogICAgcmFkaXVzID0gNiwKICAgIGNvbG9yID0gInJlZCIsCiAgICBmaWxsQ29sb3IgPSAicmVkIiwKICAgIGZpbGxPcGFjaXR5ID0gMC42LAogICAgc3Ryb2tlID0gVFJVRSwKICAgIHdlaWdodCA9IDEsCiAgICBwb3B1cCA9IH5wYXN0ZSgKICAgICAgIkRhdGU6IiwgQ1JBU0hfREFURSwgIjxicj4iLAogICAgICAiRmF0YWxpdGllczoiLCBmYXRhbGl0eV9jb3VudCwgIjxicj4iLAogICAgICAiVHlwZToiLCBGSVJTVF9DUkFTSF9UWVBFCiAgICApLAogICAgY2x1c3Rlck9wdGlvbnMgPSBtYXJrZXJDbHVzdGVyT3B0aW9ucygKICAgICAgbWF4Q2x1c3RlclJhZGl1cyA9IDUwICogMC4wMDAzLAogICAgICBzcGlkZXJmeU9uTWF4Wm9vbSA9IFRSVUUsCiAgICAgIGljb25DcmVhdGVGdW5jdGlvbiA9IEpTKCIKICAgICAgICBmdW5jdGlvbihjbHVzdGVyKSB7CiAgICAgICAgICB2YXIgY291bnQgPSBjbHVzdGVyLmdldENoaWxkQ291bnQoKTsKICAgICAgICAgIHZhciBzaXplID0gTWF0aC5taW4oNTAsIDIwICsgTWF0aC5zcXJ0KGNvdW50KSAqIDgpOwogICAgICAgICAgcmV0dXJuIG5ldyBMLkRpdkljb24oewogICAgICAgICAgICBodG1sOiAnPGRpdiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAwLCAwLCAwLjYpOyB3aWR0aDogJyArIHNpemUgKyAncHg7IGhlaWdodDogJyArIHNpemUgKyAncHg7IG1hcmdpbi1sZWZ0OiAtJyArIChzaXplLzIpICsgJ3B4OyBtYXJnaW4tdG9wOiAtJyArIChzaXplLzIpICsgJ3B4OyBib3JkZXItcmFkaXVzOiA1MCU7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBjb2xvcjogd2hpdGU7IGZvbnQtd2VpZ2h0OiBib2xkOyBib3JkZXI6IDJweCBzb2xpZCByZ2JhKDI1NSwgMCwgMCwgMC44KTtcIj4nICsgY291bnQgKyAnPC9kaXY+JywKICAgICAgICAgICAgY2xhc3NOYW1lOiAnbWFya2VyLWNsdXN0ZXItY3VzdG9tJywKICAgICAgICAgICAgaWNvblNpemU6IEwucG9pbnQoc2l6ZSwgc2l6ZSkKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgIikKICAgICkKICApICU+JQogIHNldFZpZXcobG5nID0gLTg3LjYyOTgsIGxhdCA9IDQxLjg3ODEsIHpvb20gPSAxMikKCiMgRGlzcGxheSB0aGUgbWFwCmZhdGFsaXRpZXNfbWFwCmBgYAo=